from __future__ import absolute_import
from celery import Celery, platforms
from datetime import timedelta
from celery.schedules import crontab
# 导入任务所在文件
CELERY_IMPORTS = [
    'app.tasks.task',
]
CELERYBEAT_SCHEDULE = {
    'update_sitemap_xml': {
        "task": "app.tasks.task.update_sitemap_xml",
        "schedule": crontab(hour=3, minute=30, day_of_week=1),  # 每7天执行一下update_sitemap_xml函数
        "args": (),  # 参数
    },
    'update_sitemap_by_news': {
        "task": "app.tasks.task.update_sitemap_by_news",
        "schedule": crontab(hour=7, minute=30),  # 每天执行一下update_sitemap函数
        "args": (),  # 参数
    },
    'update_promotion': {
        "task": "app.tasks.task.update_promotion",
        "schedule": crontab(hour=7, minute=30, day_of_month='*/3'),  # 每3个月执行一下update_promotion函数
        "args": (),  # 参数
    },
}
config_dict={
    #默认队列
    'celery_default_queue':'redis://:密码@主机名:端口/库索引',
    # 使用redis存储任务队列
    'CELERY_BROKER_URL':'redis://:密码@主机名:端口/库索引',
    'celery_broker_url':'redis://:密码@主机名:端口/库索引',
    # 使用redis存储任务队列
    'broker_url':'redis://:密码@主机名:端口/库索引',
    # 使用redis存储结果
    'result_backend':'redis://:密码@主机名:端口/库索引',
    # 任务序列化方式
    #'CELERY_TASK_SERIALIZER':'json',
    'task_serializer':'json',
    # 任务执行结果序列化方式
    'CELERY_RESULT_SERIALIZER':'json',
    'result_serializer':'json',
    # 指定任务接受的内容序列化类型(序列化)，一个列表；
    'CELERY_ACCEPT_CONTENT':['pickle', 'json', 'yaml'],
    'accept_content':['pickle', 'json', 'yaml'],
    # 启用UTC时区
    'CELERY_ENABLE_UTC':True,
    'enable_utc':True,
    # 启用UTC时区
    'CELERY_TIMEZONE':'Asia/Shanghai',
    'timezone':'Asia/Shanghai',
    # 拦截根日志配置
    'CELERY_HIJACK_ROOT_LOGGER':False,
    'worker_hijack_root_logger':True,
    # 每个进程最多执行2个任务后释放进程（再有任务，新建进程执行，解决内存泄漏）
    'CELERY_MAX_TASKS_PER_CHILD':2,
    'worker_max_tasks_per_child':2,
    # 存储结果过期时间，过期后自动删除
    #'CELERY_RESULT_EXPIRES':60*60*24,
    'result_expires':60*60*24,
    'beat_schedule':CELERYBEAT_SCHEDULE,
    'imports':CELERY_IMPORTS
}
platforms.C_FORCE_ROOT = True  #加上这一行
app = Celery(__name__, include=["app.tasks.task"],broker='redis://:密码@主机名:端口/库索引',backend='redis://:密码@主机名:端口/库索引')
app.conf.update(config_dict)